home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / dalla rivista / netconnect3 / amirc_33 / rexx / xref.amirx < prev   
Text File  |  1999-12-26  |  3KB  |  140 lines

  1. /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  2.  :  XRef.amirx -- Scan all joined channels on all threads for identical hosts.
  3.  :  Copyright ©1998-2000 by Jamie "Entity" van den Berge <entity@vapor.com>
  4.  :
  5.  :  Usage: /rx XRef
  6.  :
  7.  :  This script demonstrates using the FINDUSERHOST function and addressing
  8.  :  multiple threads.
  9.  :
  10.  :  Feel free to use this code in your own scripts
  11.  */
  12.  
  13. SIGNAL ON SYNTAX
  14. OPTIONS RESULTS
  15.  
  16. numhosts    = 0
  17. ports        = SHOW( "P" )
  18.  
  19. /* remember the thread we were called from,
  20.    as we want to output the result there */
  21.  
  22. thisthread    = ADDRESS()
  23.  
  24. DO WHILE ports~=""
  25.  
  26.     PARSE VAR ports port" "ports
  27.  
  28.     /* find next AmIRC thread */
  29.  
  30.     IF LEFT( port, 6 )="AMIRC." THEN DO
  31.  
  32.         thread = SUBSTR( port, 7 )
  33.         ADDRESS VALUE port
  34.         "CHANNELS"; channels = Result
  35.  
  36.         /* now cycle through all channels joined in this thread
  37.            and collect the hosts in stem variables */
  38.  
  39.         DO WHILE channels~=""
  40.  
  41.             PARSE VAR channels channel" "channels    /* get next channel */
  42.  
  43.             DROP userhost.
  44.  
  45.             /* this (ab)uses the AmIRC v3 FINDUSERHOST function to get
  46.                all nick!user@host patterns on the specified channel */
  47.  
  48.             "FINDUSERHOST * STEMVAR=userhost CHANNEL="channel
  49.  
  50.             DO i = 1 TO userhost.0
  51.  
  52.                 PARSE VAR userhost.i user"!"lamer"@"host
  53.                 entry = thread channel user
  54.  
  55.                 IF SYMBOL( "db.host" ) = "VAR" THEN DO
  56.  
  57.                     /* host already seen before */
  58.  
  59.                     db.host = db.host entry;    /* add location info to host entry */
  60.                     cl.host = 1                    /* mark host as clone */
  61.  
  62.                 END; ELSE DO
  63.  
  64.                     /* saw this host for the first time */
  65.  
  66.                     numhosts    = numhosts+1
  67.                     db.host     = entry            /* add first encounter info to this host */
  68.                     db.numhosts = host            /* add host to the list */
  69.                     cl.host     = 0                /* first encounter, so clear clone marker */
  70.  
  71.                 END
  72.             END
  73.         END
  74.     END
  75. END
  76.  
  77. /* switch back to calling thread */
  78.  
  79. ADDRESS VALUE thisthread
  80.  
  81. hits = 0
  82.  
  83. /* scan the list of hosts encountered for entries with clone marker */
  84.  
  85. DO i = 1 TO numhosts
  86.  
  87.     host = db.i
  88.  
  89.     IF cl.host THEN DO
  90.  
  91.         /* clone found! build list of locations where it was found ... */
  92.  
  93.         hits = hits + 1
  94.         line = db.host
  95.         tc   = 0
  96.  
  97.         DROP thread. report. channels. nicks.
  98.  
  99.         DO WHILE line~=""
  100.  
  101.             PARSE VAR line t c n line
  102.  
  103.             IF SYMBOL( "report.t" )="VAR" THEN DO
  104.  
  105.                 IF FIND( channels.t, c )=0 THEN channels.t = channels.t c
  106.                 IF FIND(    nicks.t, n )=0 THEN    nicks.t =    nicks.t n
  107.  
  108.             END; ELSE DO
  109.  
  110.                 tc            = tc+1;
  111.                 thread.tc    = t
  112.                 report.t    = 1;
  113.                 channels.t    = c
  114.                 nicks.t        = n
  115.  
  116.             END
  117.         END
  118.  
  119.         /* and echo it */
  120.  
  121.         CALL Local( "Report on" Bold( host )":" )
  122.  
  123.         DO y = 1 TO tc
  124.  
  125.             t = thread.y
  126.             CALL Local( "  Thread "Bold( t )": "nicks.t Bold( "->" ) channels.t )
  127.  
  128.         END
  129.     END
  130. END
  131.  
  132. IF hits = 0 THEN CALL Local( "No matches found." )
  133. EXIT
  134.  
  135. Local : "ECHO P="||"1B"x||"b«XRef» TEXT="Arg(1); RETURN
  136. ULine : RETURN "1F"x||Arg(1)"1F"x
  137. Bold  : RETURN "02"x||Arg(1)"02"x
  138. Syntax: "ECHO Error "RC": "ErrorText(RC)" on line "SIGL
  139.  
  140.